﻿// C. Complementary XOR.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
https://codeforces.com/problemset/problem/1750/C

您有两个长度为 n 的二进制字符串 a 和 b，您想让这两个字符串中的所有元素都等于 0：

选择两个索引 l 和 r (1≤l≤r≤n)；
对于尊重 l≤i≤r 的每一个 i，将 ai 改为相反的值。也就是说，ai:=1-ai；
对于每个尊重 1≤i<l 或 r<i≤n 的 i，将 bi 改为相反值。也就是说，bi:=1-bi。
你的任务是确定这是否可能，如果可能，找到这样一个适当的运算链。如果存在这样的运算链，则最多只需 n+5 次运算。

输入
每个测试由多个测试用例组成。第一行包含一个整数 t（1≤t≤105）--测试用例数。测试用例说明如下。

每个测试用例的第一行包含一个整数 n（2≤n≤2⋅105）--字符串的长度。

每个测试用例的第二行包含一个长度为 n 的二进制字符串 a，仅由字符 0 和 1 组成。

每个测试用例的第三行包含一个长度为 n 的二进制字符串 b，该字符串仅由字符 0 和 1 组成。

保证所有测试用例的 n 之和不超过 2⋅105。


输出
对于每个测试用例，如果可以使两个字符串的所有元素都等于 0，则首先打印 “YES”，否则打印 “NO”。
如果答案是 “是”，则在下一行打印一个整数 k（0≤k≤n+5）--运算次数。然后打印 k 行，每行包含两个整数 l 和 r（1≤l≤r≤n）--操作说明。

如果有多个正确答案，则打印其中任何一个。


InputCopy
5
3
010
101
2
11
10
4
1000
0011
2
10
10
3
111
111
OutputCopy
YES
1
2 2
NO
NO
YES
2
1 2
2 2
YES
2
1 1
2 3


999
5
00010
10011
4
0010
0010
4
0101
1010
5
11111
01110
3
000
000
5
10110
11111
5
10001
11011
2
00
10
3
000
001
4
0101
0110
3
011
001
2
10
01
3
010
000
4
0000
0011
4
0000
1011
5
01101
11011


999
4
0101
1010

注释
在第一个测试案例中，我们可以在 l=2 和 r=2 的情况下执行一次操作。b1:=1-1=0, b3:=1-1=0, 字符串 b 等于 000。

在第二个和第三个测试案例中，可以证明不可能使两个字符串的所有元素都等于 0。

在第四个测试用例中，我们可以执行 l=1 和 r=2 的操作
因此字符串 a 和 b 都变成了 00。

在第五个测试用例中，我们可以执行 l=1 和 r=1 的操作。字符串 a 变为 011，字符串 b 变为 100。然后，我们可以执行 l=2 和 r=3 的操作，这样字符串 a 和 b 都变成了 000。
*/


#include <iostream>
#include <vector>
#include <unordered_set>
#include <set>
 
using namespace std;

int T, n;
string a, b;


void solve() {
	cin >> n;
	cin >> a >> b;
	a.insert(a.begin(), '#');
	b.insert(b.begin(), '@');

	int diff = 0; int same = 0;
	int oneidx = -1; int onecnt = 0;
	for (int i = 1; i <= n; i++) {
		if (a[i] == b[i]) same++;
		else diff++;
		if (a[i] == '1') { oneidx = i; onecnt++; }
	}

	if (same && diff) {
		cout << "NO" << endl;
		return;
	}
	int anscnt = 0; vector<pair<int, int>> ans;
	if (diff > 0 && 1 == onecnt) {
		cout << "YES" << endl;
		cout << 1 << endl;
		cout << oneidx << " " << oneidx << endl;
		return;
	}
	

	if (diff > 0) {
		anscnt += 1;  oneidx = -1;  onecnt = 0;
		ans.push_back({ 1,n });
		for (int i = 1; i <= n; i++) {
			a[i] = (a[i] == '0') ? '1' : '0';
			if (a[i] == '1') {
				oneidx = i;  onecnt++;
			}
		}
	}

	if (onecnt > 1) {
		//onecnt  > 1  same
		int l = 1; int r = n;
		while (l <= r) {
			while (l <= n && a[l] == '0') l++;
			while (r >= 1 && a[r] == '0') r--;
			if (l > r) break;
			if (l == r) {
				onecnt = 1; oneidx = l;
				break;
			}
			else {
				anscnt++;
				ans.push_back({l,l});
				anscnt++;
				ans.push_back({ r,r });
				l++; r--;
			}
		}
	}

	if (1 == onecnt) {
		anscnt += 2;
		if (oneidx == 1) {
			ans.push_back({ oneidx + 1 ,n });
			ans.push_back({ 1 , n });
		}
		else {
			ans.push_back({ 1  ,oneidx - 1 });
			ans.push_back({ 1,oneidx});
		}
	}

	cout << "YES" << endl;
	cout << anscnt << endl;
	for (const auto& e : ans) {
		cout << e.first << " " << e.second << endl;
	}

	return;
}


int main() {
	cin >> T;
	while (T--) {
		solve();
	}

	return 0;
}

